#include"DynamicArray.h"
#include<iostream>
#include<cstring>

    void MyFreeInt(DynamicArray::ElementType element)
    {   
        int* str = (int*)element;
        
        delete str;
    }
    


    void MyFreeChar(DynamicArray::ElementType element)
    {   
        char* str = (char*)element; 
            delete str;
        

    }

    // DynamicArray::ElementType TranceIndex()
    // {
        
    // }

    void PrintInt(DynamicArray::ElementType element)
    {   
        int* str = (int*)element;

            std::cout<<*str++;
            std::cout<<" ";

    }

    void PrintChar(DynamicArray::ElementType element)
    {
        char* str = (char*)element;
        std::cout<<str;
        std::cout<<" ";
    }

    bool IsEqualInt(DynamicArray::ElementType element,DynamicArray::ElementType element1)
    {
        int* str1 = (int*)element;
        int* str2 = (int*)element1; 
        for(int i=0;i<10;i++)
        {
            if(str1[i] != str2[i])
            {
                return false;
            }
        } 
        return true;                              
    }

    bool IsEqualChar(DynamicArray::ElementType element,DynamicArray::ElementType element1)
    {
        char* str1=(char*)element;
        char* str2=(char*)element1;
        return strcmp(str1,str2) == 0;
    }

    bool IsBigChar(DynamicArray::ElementType element,DynamicArray::ElementType element1)
    {
        char* str1=(char*)element;
        char* str2=(char*)element1;
        return strcmp(str1,str2) > 0;
    }

    bool IsEqualArray(DynamicArray a1,DynamicArray a2)
    {
        a1.SetCompare(IsEqualChar);
        
        return a1 == a2;
    }

int main()
{
    // DynamicArray a;
    // for(int i=0;i<10;i++)
    // {
    //    a.InsertTail(i+1);
    // }
    // for(int i=0;i<10;i++)
    // {
    //    a.InsertHead(i+1);
    // }
    // a.show();
    
    // a.InsertByIndex(99,1);
    // a.show();

    // a.RemovrByIndex(1);
    // a.show();

    // a.RemovrByElement(10);
    // a.show();

    // int* p = a.FindByIndex(1);
    //  std::cout<<*p<<std::endl;

    // DynamicArray r = a.FindByElement(10);
    // r.show();


    // a.UpdateByIndex(0,99);
    // a.UpdateByElement(9,87);
    // a.show();
//     DynamicArray b= a;


//     b.show();

// //  

    


    // a.Sort();
    // a.show();
    // a.Duplicate();

    // a.show();

    // DynamicArray b=a;
    // a.Merge(b).show();

    // DynamicArray a;
    // for(int i=0;i<10;i++)
    // {
    //    a.InsertTail(i+1);
    // }
    // a.Sort();
    // a.show();
    // DynamicArray b;
    // for(int i=3;i<15;i++)
    // {
    //    b.InsertTail(i+1);
    // }
    // b.Sort();
    // b.show();

    // a.FindInterSection(b).show();

    // DynamicArray a;

    // int c[10]= {1,231,3,56,3,23};

    // int*cc  = new int[10];
    
    // for(int i=0;i<10;i++)
    // {
    //     cc[i]=c[i];
    // }
    // int c1[10]= {1,2,3,4,5,6};
    
    // int* cc1 = new int[10];
    //     for(int i=0;i<10;i++)
    // {
    //     cc1[i]=c1[i];
    // }
    
    // char ccc2[]={"abcdefgh"};
   
    // char* cc2 = new char[10];
    // cc2 = ccc2;


    // a.SetFreeptr(MyFreeInt);
    
    // a.InsertTail(&c);
    // a.InsertTail(&c1);

    // a.InsertTail(ccc2);
    // char c2[10]={"abcdef"};
    // a.InsertTail(c2);
    // a.RemovrByIndex(1);
    
    // a.SetCompare(IsEqualInt);
    // a.RemovrByElement(c);


    // a.SetPrint(PrintInt);
    // a.show();


    // a.show(PrintInt);

    
    DynamicArray a;
    DynamicArray b;

    // a.SetFreeptr(MyFreeChar);
    // b.SetFreeptr(MyFreeChar);

    char c1[10] ={"abcd"};
    char c2[10] ={"1234"};
    char c3[10] ={"efghj"};
    char c4[10] ={"123456789"};
    char c5[10] ={"twh"};
    
    a.InsertTail(c1);
    a.InsertTail(c3);
    a.InsertTail(c1);
    a.InsertTail(c2);

    // b.InsertTail(c1);

    a.SetPrint(PrintChar);
    a.SetCompareArray(IsEqualArray);
   
    // b.SetPrint(PrintChar);

    // a.show();
    //     std::cout<<std::endl;
    // b.show();

    // a.InsertHead(c4);
    // a.show();

    // std::cout<<std::endl;

    // a.InsertByIndex(c2,2);
    // a.show();

    // a.SetCompare(IsEqualChar);
    // DynamicArray c = a.FindByElement(c1);
    
    // c.SetPrint(PrintChar);
    // c.SetFreeptr(MyFreeChar);
    // c.show();

    // PrintChar(a.FindByIndex(0));
    // std::cout<<std::endl;


    // a.RemovrByIndex(1);
    // a.show();

    // a.SetCompare(IsEqualChar);
    // a.RemovrByElement(c2);
    // a.show();



    // a.UpdateByIndex(2,c1);
    // a.show();

    // a.SetCompare(IsEqualChar);
    // a.UpdateByElement(c1,c2);
    // a.show();

    // a.SetCompareBig(IsBigChar);
    // std::cout<<a.BinarySearch(c1)<<std::endl;

    // DynamicArray b;
    // b.SetFreeptr(MyFreeChar);
   
    // b.InsertTail(c2);

    // a.SetCompareBig(IsBigChar);
    // DynamicArray c = a.Merge(b);

    // c.SetFreeptr(MyFreeChar);
    // c.SetPrint(PrintChar);
    // c.show();
  

    b.InsertTail(c1);
    b.InsertTail(c3);
    // b.SetCompareArray(IsEqualArray);
   
    a.SetCompare(IsEqualChar);
    a.SetCompareBig(IsBigChar);
    
    a.Sort();

    a.show();
    std::cout<<std::endl;   
    
    // b.Sort();

    // DynamicArray c = a.FindInterSection(b);

    // c.SetFreeptr(MyFreeChar);
    // c.SetPrint(PrintChar);
    // c.show();
   
   
    
    
    std::cout<<a.IsConChild(b)<<std::endl;






    return 0;
}